# -*- coding: utf-8 -*-
"""
ovo和ovr
Created on Mon Apr 23 17:50:21 2018

@author: Allen
"""
'''
sklearn 中 自动封装了 ovo和ovr，可以传入不同的参数实现
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

iris = datasets.load_iris()

X = iris.data
y = iris.target

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, random_state = 666 )

from sklearn.linear_model import LogisticRegression

# 使用 OvR 的方式
log_reg = LogisticRegression()
log_reg.fit( X_train, y_train )
print( log_reg.score( X_test, y_test ) ) # 0.947368421053
# 使用 OvO 的方式
log_reg1 = LogisticRegression( multi_class = "multinomial", solver = "newton-cg" )
log_reg1.fit( X_train, y_train )
print( log_reg1.score( X_test, y_test ) ) # 1.0

'''
ovo 的方式，更加准确，但是耗时也更加长
'''

'''
sklearn 中提供了 两个类：ovo和ovr
可以用任意的二分类算法，运用这两个类来解决多分类任务
运用这两个类，可以对所有的2分类法进行多分类
'''
from sklearn.multiclass import OneVsRestClassifier
ovo = OneVsRestClassifier( log_reg )
ovo.fit( X_train, y_train )
print( ovo.score( X_test, y_test ) ) # 0.947368421053

from sklearn.multiclass import OneVsOneClassifier
ovr = OneVsOneClassifier( log_reg )
ovr.fit( X_train, y_train )
print( ovr.score( X_test, y_test ) ) # 1.0

